package com.itheima.d05_atm_manager_exception_handle.service;


import com.itheima.d05_atm_manager_exception_handle.entity.Account;
import com.itheima.d05_atm_manager_exception_handle.exception.AccountNotFoundException;
import com.itheima.d05_atm_manager_exception_handle.exception.PasswordErrorException;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

/**
 * 取款机业务类：提供ATM取款机的各种业务功能
 *   1.展示欢迎菜单
 *   2.登录功能
 *      2.1 查询账户信息
 *      2.2 存款功能
 *      2.3 取款功能
 *      2.4 转账功能
 *      2.5 修改密码功能
 *      2.6 退出功能
 *      2.7 注销账户
 *   3.开户功能
 */
public class ATMService {

    //业务类中，维护一个集合容器，管理所有ATM取款机账户
    private ArrayList<Account> accounts = new ArrayList<>();

    //业务类中，维护一个键盘扫描器，方便各个环节使用
    private Scanner sc = new Scanner(System.in);

    //业务类中，维护一个账户对象，记录登录成功的账户信息
    private Account loginSuccessAccount;


    //1.展示欢迎菜单
    public void start(){

        //int num =  10 / 0;

        //模拟数据
        Account account1 = new Account("110", "张三", "123456", "男", 5000.0, 2000.0);
        Account account2 = new Account("911", "李四", "654321", "女", 8000.0, 3000.0);
        accounts.add(account1);
        accounts.add(account2);


        //1.1 死循环，持续提供欢迎页展示服务
        while(true){
            System.out.println("==欢迎进入ATM取款机系统==");
            System.out.println("1.用户登录");
            System.out.println("2.用户开户");
            System.out.println("请选择您要操作的命令：");

            //1.2 接收用户输入的功能编号，实现业务功能
            int choose = sc.nextInt();
            switch (choose){
                case 1:
                    System.out.println("==用户登录==");
                    login();
                    break;
                case 2:
                    System.out.println("==用户开户==");
                    register();
                    break;
                default:
                    System.out.println("输入的功能编号有误，请重新输入！");
            }

            System.out.println();
            System.out.println();
            System.out.println();
        }

    }

    //2.开户功能
    public void register(){
        //2.1 提示用户输入开户信息
        System.out.println("请输入用户名：");
        String username = sc.next();
        System.out.println("请输入性别：");
        String sex = sc.next();
        //TODO 校验性别是否正确

        System.out.println("请输入密码：");
        String password = sc.next();
        System.out.println("请输入确认密码：");
        String passwordOk = sc.next();
        //TODO 校验密码是否一致

        System.out.println("请输入账户每次取现的额度：");
        double limit = sc.nextDouble();
        //TODO 校验限额额度是否正确

        //2.1.1 系统生成账户卡号：八位数字组成
        String cardId = "";
        Random r = new Random();
        for (int i = 0; i < 8; i++) {
            cardId += r.nextInt(10);//0~9
        }
        //TODO 检测卡号是否被使用

        //2.2 创建实体类对象，存储用户账户信息
        Account  account = new Account(cardId, username, password, sex, 0, limit);

        //2.3 将用户账户信息添加到业务类管理账户集合中
        accounts.add(account);
        System.out.println("恭喜您，"+account.getUsername()+"，账户开户成功！您的卡号是：" + cardId);
    }


    //3.登录功能
    public void login() {
        //TODO 检查系统是否存在账户
        //3.1 校验卡号
        System.out.println("请输入卡号：");
        String cardId = sc.next();
        //建议：抽取一个根据卡号查询账户的方法（很多地方都需要使用此功能）
        Account loginAccount = findAccountByCardId(cardId);

        if (loginAccount == null) {
            //卡号不存在，登录失败
            System.out.println("系统中不存在该账户卡号~~");

            throw new AccountNotFoundException("卡号不存在");
        }

        //卡号存在，继续校验密码
        //3.2 校验密码
        System.out.println("请输入密码：");
        String password = sc.next();
        if (!loginAccount.getPassword().equals(password)) {
            System.out.println("密码输入错误，登录失败~~");
            throw new PasswordErrorException("密码输入错误");
        }

        //3.3 登录成功，展示主功能菜单
        System.out.println("恭喜您，"+loginAccount.getUsername()+"，您已进入系统，您的卡号是："+loginAccount.getCardId());
        //登录成功后，将用户信息保存到业务类中，全局维护
        //成员变量==============局部变量（扩大局部变量的作用范围）
        loginSuccessAccount = loginAccount;
        showMainMenu();
    }

    //抽取一个根据卡号查询账户的方法
    public Account findAccountByCardId(String cardId){
        //遍历账户集合
        for (int i = 0; i < accounts.size(); i++) {
            //获取集合中的每一个账户对象
            Account account = accounts.get(i);
            //获取账户的卡号
            String accountCardId = account.getCardId();
            //accountCardId = null;
            //比对
            if(accountCardId.equals(cardId)){
                //找到了
                return account;
            }
        }
        //没找到
        return null;
    }


    //4.展示主功能菜单
    public void showMainMenu(){
        //4.1死循环，持续展示主功能菜单
        while(true){
            System.out.println("==ATM取款机系统功能菜单，您可以办理以下业务==");
            System.out.println("1.查询账户信息");
            System.out.println("2.存款");
            System.out.println("3.取款");
            System.out.println("4.转账");
            System.out.println("5.修改密码");
            System.out.println("6.退出");
            System.out.println("7.注销账户");
            System.out.println("请选择您要办理的业务：");
            //4.2 接收用户输入的功能编号，实现业务功能
            int choose = sc.nextInt();
            switch (choose){
                case 1:
                    System.out.println("正在查询账户信息...");
                    showAccountInfo();
                    break;
                case 2:
                    System.out.println("正在办理存款业务...");
                    saveMoney();
                    break;
                case 3:
                    System.out.println("正在办理取款业务...");
                    takeoutMoney();
                    break;
                case 4:
                    System.out.println("正在办理转账业务...");
                    transferMoney();
                    break;
                case 5:
                    System.out.println("正在办理修改密码业务...");
                    changePassword();
                    break;
                case 6:
                    System.out.println("正在退出系统...");
                    return; //退出
                case 7:
                    System.out.println("正在注销账户...");
                    destroyAccount();
                    break;
                default:
                    System.out.println("输入的功能编号有误，请重新输入！");
            }
            System.out.println();
            System.out.println();
            System.out.println();
        }
    }


    //5.查询账户信息
    public void showAccountInfo(){
        //5.1 获取登录成功后的账户对象，打印即可
        System.out.println("=="+loginSuccessAccount.getUsername()+"，账户信息==");
        System.out.println("账户编号："+loginSuccessAccount.getCardId());
        System.out.println("账户姓名："+loginSuccessAccount.getUsername());
        System.out.println("账户性别："+loginSuccessAccount.getSex());
        System.out.println("账户余额："+loginSuccessAccount.getMoney());
        System.out.println("账户限额："+loginSuccessAccount.getLimit());
    }

    //6.存款功能
    public void saveMoney(){
        //6.1 提示用户输入存款金额
        System.out.println("请输入存款金额：");
        //6.2 接收用户输入的存款金额
        double money = sc.nextDouble();
        //TODO 验证存款金额是否正确

        //6.3 更新账户余额                         账户余额                    +   存款金额
        loginSuccessAccount.setMoney(     loginSuccessAccount.getMoney()    +    money   );

        //6.4 展示存款成功信息
        System.out.println("恭喜您，存款成功，账户余额："+loginSuccessAccount.getMoney());
    }

    //7.取款功能
    public void takeoutMoney(){
        //7.1 提示用户输入取款金额
        System.out.println("请输入取款金额：");
        //7.2 接收用户输入的取款金额
        double money = sc.nextDouble();
        //TODO 验证取款金额是否正确

        //TODO 验证账户余额是否充足
        //TODO 验证是否超过限额

        //7.3 更新账户余额                         账户余额                    -   存款金额
        loginSuccessAccount.setMoney(     loginSuccessAccount.getMoney()    -    money   );

        //7.4 展示存款成功信息
        System.out.println("恭喜您，取款成功，账户余额："+loginSuccessAccount.getMoney());
    }

    //转账功能
    public void transferMoney(){
    }

    //修改密码功能
    public void changePassword(){
    }

    //注销账户功能
    public void destroyAccount(){
    }
}
